package com.base.common.action;

import com.base.common.bean.ActionResult;
import com.base.common.utils.StringUtils;
import com.cjy.common.service.CRUDService;

import static com.base.common.GlobaConstants.OK;

/**
 * 本Action帮助自动实现CRUD。
 * 使用说明：
 * 1.service需要继承CRUDService
 * 2.Action继承此基类即可
 * 3.目前所有返回都是JSON格式数据,如果要自定义result,可以在自己的action中定义@Result
 * 5.在prepared方法中，需要注入crudService与model;
 * 2013-12-3 下午4:17:40
 * @author jay.zhoujingjie
 */

public abstract class AbstractCRUDAction<T> extends AbstractBaseAction
{

    private static final long serialVersionUID = 1L;

    // CRUDService接口，具体实现service需实现此接口
    private CRUDService<T> crudService;
    // model
    private T model;


    /**
     * 绑定属性
     * @param crudService
     * @param model void
     * @author jay.zhoujingjie
     */
    protected void bindProperties(CRUDService<T> crudService, T model)
    {
        this.crudService = crudService;
        this.model = model;
    }

    /**
     * 创建方法
     * @return String
     * @author hubery.niejinzhen
     */
    public String create()
    {
        prepare();
        actionResult = ActionResult.getActionResult(crudService.create(model) > 0 ? OK : ERROR);
        return returnType();
    }

    /**
     * 删除方法
     * @return String
     * @author hubery.niejinzhen
     */
    public String delete()
    {
        actionResult = ActionResult.getActionResult(crudService.delete(uuid) > 0 ? OK : ERROR);
        return returnType();
    }



    /**
     * 将model放入实体类
     * 子类使用范例：
     * protected void finish(User model)
     * {
     * this.user = model;
     * }
     * @param model void
     * @author hubery.niejinzhen
     */
    protected abstract void finish(T model);

    public T getModel()
    {
        return model;
    }

    /**
     * 将实体类注入model
     * 子类使用范例：
     * protected void prepare()
     * {
     * this.bindProperties(userService,user)
     * }
     * @author hubery.niejinzhen void
     */
    protected abstract void prepare();

    /**
     * 查询方法
     * @return String
     * @author hubery.niejinzhen
     */
    public String read()
    {
        prepare();
        model = crudService.read(uuid);
        finish(model);
        actionResult = ActionResult.getActionResult(model);
        return returnType();
    }

    /**
     * 增加或者修改:uuid为null为增加,uuid不为null为修改
     * @return String
     * @author jay.zhoujingjie
     */
    public String saveOrUpdate()
    {
        if (StringUtils.isEmptyByTrim(uuid) || "0".equals(uuid) //
                || "add".equals(uuid) || "create".equals(uuid))
        {
            return create();
        } else
        {
            return update();
        }
    }

    public void setModel(T model)
    {
        this.model = model;
    }

    /**
     * 修改方法
     * @return String
     * @author hubery.niejinzhen
     */
    public String update()
    {
        prepare();
        actionResult = ActionResult.getActionResult(crudService.update(model) > 0 ? OK : ERROR);
        return returnType();
    }



}
